//
//  IWxChatMgrChat.h
//  WXIMSDK
//  提供基础消息操作
//  Created by vince on 14-9-5.
//  Copyright (c) 2014年 网信金融集团. All rights reserved.
//


#import <Foundation/Foundation.h>
#import "IWxChatMgrChatDefs.h"
#import "ChatMessage.h"
#import "IChatProgressDelegate.h"

#import "EWxChatMgrChatDelegate.h"



@interface IWxChatMgrChat : NSObject

+ (IWxChatMgrChat *)sharedInstance;

/*!
 @method
 @brief  发送文本消息
 @param  contactId     接收消息好友id
 @param  messageBody   文本消息内容  最大长度为 kMessageBodyMaxLen
 @result 返回值         非空，为消息id
         回调方法        sendMessageRspState:messageId:error: 有发送状态返回
 */
- (NSString *)sendMessageText:(NSString *)messageBody
                    toContact:(NSString *)contactId
                  isGroupChat:(BOOL)isyes
                     delegate:(id)delegate;

//text/plain：纯文本 image/*：图片 audio/*：语音 video/*视频 */*：文件
/**
 *  发送收藏的消息
 *
 *  @param contactID
 *  @param messageText
 *  @param fileType      消息类型  //
 *  @param servieUrl     服务器路径
 *  @param localFileName 本地路径
 *  @param fileSize      文件大小
 *  @parm  isGroup    YES
 */
- (NSString *)sendCollectMessageContactID:(NSString *)contactID
                            message:(NSString *)messageText
                           filetype:(NSString *)fileType
                         serviceUrl:(NSString *)servieUrl
                           fileName:(NSString *)localFileName
                           fileSize:(NSInteger)fileSize
                            isGroup:(BOOL)isGroup;




/*!
 @method
 @brief  发送文件消息消息
 @param  contactId     接收消息好友id
 @param  messageBody   文本消息内容  最大长度为 kMessageBodyMaxLen
 @result 返回值         非空，为消息id
 回调方法        sendMessageRspState:messageId:error: 有发送状态返回
 */
- (NSString *)sendFileText:(NSString *)messageBody
                 toContact:(NSString *)contactId
               isGroupChat:(BOOL)isyes
                  delegate:(id)delegate;
/**
 *  仅把数据存入数据库，不执行发送操作
 *
 *  @param contactId
 *  @param messageBody
 *  @param isyes
 */
- (NSString *)textMessageOnlySvaeDBContavtID:(NSString *)contactId
                               message:(NSString *)messageBody
                               isGroup:(BOOL)isyes;

/*!
 @method
 @brief  发送图片文件消息
 @param  contactId 接收消息好友id
 @param  fileUrl   图片文件全路径名称
 @param  desc      图片文件描述  最大长度kGroupDescribeMaxLen
 @param  progress  进度条的代理回调，若不用可以传nil
 @result 返回值     非空，为消息id
         回调方法   sendMessageRspState:messageId:error: 有发送状态返回
 */
- (NSString *)sendMessageImageToContact:(NSString *)contactId
                           imagefileURL:(NSString *)imagefileURL
                                   desc:(NSString *)desc isGroupChat:(BOOL)isyes
                               progress:(id<IChatProgressDelegate>)progress;

/*!
 @method
 @brief  发送普通文件消息
 @param  contactId   接收消息好友id
 @param  fileUrl     文件全路径名称
 @param  desc        文件描述  最大长度kGroupDescribeMaxLen
 @param  progress    进度条的代理回调，若不用可以传nil
 @result 返回值       非空，为消息id
         回调方法      sendMessageRspState:messageId:error: 有发送状态返回
 */
- (NSString *)sendMessageFileToContact:(NSString *)contactId
                               fileURL:(NSString *)fileURL
                                  desc:(NSString *)desc
                           isGroupChat:(BOOL)isyes
                              progress:(id<IChatProgressDelegate>)progress;


/*!
 @method
 @brief  发送音频消息
 @param  contactId      接收消息好友id
 @param  voiceFileURL   音频消息资源文件路径
 @param  desc           文件描述  最大长度kGroupDescribeMaxLen
 @param  duration       语音时长
 @param  progress       进度条的代理回调，若不用可以传nil
 @result 返回值          非空，为消息id
         回调方法        sendMessageRspState:messageId:error: 有发送状态返回
 */
- (NSString *)sendMessageVoiceToContact:(NSString *)contactId
                           voiceFileURL:(NSString *)voiceFileURL
                               duration:(NSInteger)duration
                                   desc:(NSString *)desc
                            isGroupChat:(BOOL)isyes
                               progress:(id<IChatProgressDelegate>)progress;

/*!
 @method
 @brief  发送视频消息
 @param  contactId     接收消息好友id
 @param  videoFileURL  视频消息资源文件路径
 @param  desc          文件描述  最大长度kGroupDescribeMaxLen
 @param  duration      文件播放或录制时长
 @result 返回值         非空，为消息id
         回调方法        sendMessageRspState:messageId:error: 有发送状态返回
 */
- (NSString *)sendMessageVideoToContact:(NSString *)contactId
                           videoFileURL:(NSString *)videoFileURL
                               duration:(NSInteger)duration
                                   desc:(NSString *)desc
                            isGroupChat:(BOOL)isyes
                               progress:(id<IChatProgressDelegate>)progress;

/*!
 @method
 @brief  发送自定义消息
 @param  contactId    接收消息好友id
 @param  content      自定义消息内容  最大长度kMessageBodyMaxLen
 @param  msgtype      消息类型值必须大于100  否则，返回Chat_msgtype_Error
 @result 返回值        非空，为消息id
         回调方法       sendMessageRspState:messageId:error: 有发送状态返回
 */
- (NSString *)sendCustomerMessage:(NSString *)content
                        toContact:(NSString *)contactId
                          msgtype:(NSInteger)msgtype;


/*!
 @method
 @brief   下载普通文件、音频文件、视频文件、大图片文件
 @param   messageId   要下载附件消息的Id
 @param   progress 进度条的代理回调，若不用可以传nil
 @param   (void(^)(NSString *state)) 下载成功与否block返回
 @result
 */
- (void)downloadFileByMessageId:(NSString *)messageId
                       progress:(id<IChatProgressDelegate>)progress
                  completeBlock:(void(^)(BOOL state, NSString *filePath))complete;

/*!
 @method
 @brief   下载大图片文件、小图片文件
 @param   messageId   要下载文件的消息Id
 @param   imageType  0:默认小图片文件；1：大图片文件 imageType不是这两个值，返回Chat_imageType_Error
 @param   progress 进度条的代理回调，若不用可以传nil
 @param   (void(^)(BOOL state, NSString *filePath)) 下载成功与否block返回
 @result
 */
- (void)downloadImageFileByMessageId:(NSString *)messageId
                           imageType:(NSInteger)imageType
                            progress:(id<IChatProgressDelegate>)progress
                       completeBlock:(void(^)(BOOL state, NSString *filePath))complete;

/*!
 @method
 @brief      同步方法获取与某联系人Id的聊天历史记录
 @param      userId联系人id或者群组id
 @param      beginIndex开始索引值（index从0开始）
 @param      count：要获取的条数（如实际条数小于count，则返回实际条数） 若count为0，则表示默认：获取全部
 @result     参数为空或聊天记录为空，则返回nil，其他情况返回类型为GetChatMessage的对象数组
 */
- (NSMutableArray*)fetchMessageListWithUser:(NSString *)userId
                                 beginIndex:(NSInteger)beginIndex
                                      count:(NSInteger)count;

/*!
 @method
 @brief      获取与某个联系人或群组聊天的未读消息个数
 @param      contactId联系人id或者群组id
 @discussion 同步方法
 @result     参数为空或聊天记录为空，则返回0，其他情况返回未读消息条数
 */
- (NSInteger)getUnreadMsgCountToContactId:(NSString *)contactId;

/*!
 @method
 @brief       删除与某个好友的所有聊天记录
 @param       contactId 要删除聊天消息好友的Id
 @discussion  同步方法
 @result      返回成功or失败
 */
- (BOOL)deleteAllMessageToContactId:(NSString *)contactId;

/*!
 @method
 @brief       获取最近聊天过的联系人最新消息记录列表
 @discussion  同步方法
 @result      返回 ChatRecent 对象数组  （空则 返回nil）
 */
- (NSMutableArray *)getMyAllConversation;


/*!
 @method
 @brief      设置消息状态为已读
 @param      messageId 要设置的消息Id
 @discussion 同步方法
 @result     成功:Chat_Success  失败:Chat_Failure messageId参数:Chat_msgId_Error (messageId不存在Or为空)
 */
- (NSString *)deleteMessage:(NSString *)messageId;

/*!
 @method
 @brief       设置消息状态为已读
 @param       messageId 要设置的消息Id
 @discussion  同步方法
 @result      成功:Chat_Success  失败:Chat_Failure messageId参数:Chat_msgId_Error (messageId不存在Or为空)
 */
- (NSString *)markMsgAsRead:(NSString *)messageId;


/*!
 @method
 @brief      获取所有未读消息列表
 @discussion 同步方法
 @result     返回ChatMessage对象数组
 */
- (NSMutableArray *)getAllUnreadedMessage;



/*!
 @method
 @brief      注册一个监听对象到监听列表中
 @discussion 把监听对象添加到监听列表中准备接收相应的事件
 @param      delegate 需要注册的监听对象
 @result
 */
- (void)registDelegate:(id<EWxChatMgrChatDelegate>)delegate;

/*!
 @method
 @brief      从监听列表中移除一个监听对象
 @discussion 把监听对象从监听列表中移除,取消接收相应的事件
 @param      delegate 需要移除的监听对象
 @result
 */
- (void)unregistDelegate:(id<EWxChatMgrChatDelegate>)delegate;

/*!
 @method
 @brief      同步方法设置消息是否已读状态
 @discussion 好友收到查看置为已读
 @param      messageId消息id
 @result
 */
- (BOOL)setTheMessageIsReaded:(NSString *)messageId;

/*!
 @method
 @brief      同步方法设置消息发送状态
 @discussion 服务器收到，对方收到，发送失败
 @param      messageId消息id isSendSuccess消息状态
 @result
 */
- (BOOL)setTheMessageIsSendSuccess:(NSString *)messageId
                    withSendStatus:(NSString *)isSendSuccess;


@end
